package leetcode.editor.cn;
//假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 
//
// 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？ 
//
// 注意：给定 n 是一个正整数。 
//
// 示例 1： 
//
// 输入： 2
//输出： 2
//解释： 有两种方法可以爬到楼顶。
//1.  1 阶 + 1 阶
//2.  2 阶 
//
// 示例 2： 
//
// 输入： 3
//输出： 3
//解释： 有三种方法可以爬到楼顶。
//1.  1 阶 + 1 阶 + 1 阶
//2.  1 阶 + 2 阶
//3.  2 阶 + 1 阶
// 
// Related Topics 动态规划 
// 👍 1245 👎 0

//Java：爬楼梯
class P70ClimbingStairs {
    public static void main(String[] args) {
        Solution solution = new P70ClimbingStairs().new Solution();
        // TO TEST
        int n = 2;
        int count = solution.climbStairs(n);
        System.out.println("假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 \n" + "注意：给定 n 是一个正整数 \n" +
                "每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？,答案是: \n" + count);

    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int climbStairs(int n) {
            //定义一个数值 res[n]等于爬n阶的方法数量。因为数组的下标从0开始，所以数组的长度为n+1。
            int[] res = new int[n + 1];
            // 这个值是固定的
            res[0] = 1;
            //爬1阶时，只有1个方法
            res[1] = 1;
            for (int i = 2; i <= n; i++) {
                //爬i阶时，方法数 == 倒数第1阶的方法数 + 倒数第2阶的方法数
                //比如说有5阶，第1阶你可能会爬1个台阶或者2个台阶。方法数 = 第1阶爬1个台阶的方法数 + 第1阶爬2个台阶的方法数。
                //第1阶爬1个台阶的方法数 = 爬剩下的4个台阶的方法数； 同理，第2阶爬2个台阶的方法数 = 爬剩下3个台阶的方法数。
                //爬5个台阶的方法数 = 爬3个台阶的方法数 + 爬4个台阶的方法数。即res[i] = res[i-1] + res[i-2];
                res[i] = res[i - 1] + res[i - 2];
            }
            //返回数组的最后一个元素，即爬n阶的方法数。
            return res[n];
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}